// 合并两个数组
var arr1 = ['name1','name2']
var arr2 = ['name3','name4']
Array.prototype.push.apply(arr1,arr2)
// 相当于arr1.push(arr2)
console.log(arr1);

// 上述方法一个弊端就是,当arr2太大时不要使用这个方法来合同数组,因为一个函数能够接受的参数个数有限制的.
// 不同的引擎有不同的限制，JS核心限制在 65535，有些引擎会抛出异常，有些不抛出异常但丢失多余参数。
// 解决方法:就是将参数数组切块后循环传入目标方法
function concatOfArray(arr1, arr2) {
    var QUANTUM = 32768;
    for (var i = 0, len = arr2.length; i < len; i += QUANTUM) {
        Array.prototype.push.apply(
            arr1, 
            arr2.slice(i, Math.min(i + QUANTUM, len) )
        );
    }
    return arr1;
}

// 验证代码
var arr1 = [-3, -2, -1];
var arr2 = [];
for(var i = 0; i < 1000000; i++) {
    arr2.push(i);
}

Array.prototype.push.apply(arr1, arr2);
// Uncaught RangeError: Maximum call stack size exceeded

concatOfArray(arr1, arr2);
// (1000003) [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]


// 链接：https://juejin.im/post/5c060585e51d45480061b05f
